import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class Fondo here.
 * 
 * @author Montes Alonso Irli Natali
 * @version Programacion Orientada a Objetos
 */
public class Fondo extends World
{
    private int nivel;
    private int puntaje;
    private int vidas;
    private Letrero score;
    private Letrero lives;
    private Score2 puntos;

    /**
     * Constructor for objects of class Fondo.
     * 
     */
    public Fondo()
    {    
        super(600, 400, 1); 
        vidas=3;
        puntaje=0;

        nivel=0;
        prepare();
    }

    /**
     * @return lives regresa las vidas
     */
    public Letrero getLives()
    {
        return lives;
    }

    /**
     * @return score regresa un puntaje
     */
    public Letrero getScore()
    {
        return score;
    }

    /**
     * Metodo para llamar desde el inicio a la imagen que sera el menu
     */
    private void prepare()
    {
        setBackground("menu.png");
        Play play = new Play();
        addObject(play, 76, 76);
        play.setLocation(454, 88);
        Help help = new Help();
        addObject(help, 461, 236);
        play.setLocation(373, 87);
        help.setLocation(453, 200);
        play.setLocation(349, 87);
        help.setLocation(443, 198);
        Records records = new Records();
        addObject(records, 365, 330);
        records.setLocation(356, 316);
    }

    /**
     *metodo para el quinto nivel
     */
    private void prepare5()
    {
        Patricio patricio = new Patricio();
        puntos= new Score2();
        addObject(puntos,300,20);
        puntos.muestraPuntaje();
        score = new Letrero("Score: " + puntaje);
        addObject(score,503,20);
        addObject(patricio, 327, 336);
        lives = new Letrero("Pretty Lives: "+ vidas);
        addObject(lives,80,20);
        Globito debil = new Globito(patricio, 5);
        addObject(debil, 373, 293);
        debil.setLocation(365, 283);
        Globito debil2 = new Globito(patricio, 5);
        addObject(debil2, 294, 292);
        patricio.recibeGlobo(debil,debil2);
        debil2.setLocation(287, 286);
        patricio.setLocation(334, 342);
        debil2.setLocation(314, 289);
        debil.setLocation(366, 289);
        Caja1 caja1 = new Caja1();
        addObject(caja1, 502, 199);
        Caja1 caja12 = new Caja1();
        addObject(caja12, 212, 207);
        caja1.setLocation(438, 211);
        Maderota maderota = new Maderota();
        addObject(maderota, 438, 183);
        maderota.setLocation(431, 177);
        Maderota maderota2 = new Maderota();
        addObject(maderota2, 209, 180);
        maderota2.setLocation(202, 171);
        maderota2.setLocation(201, 172);
        Cactusizq cactusizq = new Cactusizq();
        addObject(cactusizq, 558, 113);
        cactusizq.setLocation(554, 102);
        Cactusder cactusder = new Cactusder();
        addObject(cactusder, 58, 111);
        cactusder.setLocation(45, 106);
        Maderita maderita = new Maderita();
        addObject(maderita, 558, 152);
        maderita.setLocation(557, 144);
        Maderita maderita2 = new Maderita();
        addObject(maderita2, 57, 156);
        maderita2.setLocation(49, 145);
        cactusder.setLocation(40, 103);
        Cactus cactus = new Cactus();
        addObject(cactus, 460, 120);
        Cactus cactus2 = new Cactus();
        addObject(cactus2, 428, 113);
        Cactus cactus3 = new Cactus();
        addObject(cactus3, 403, 137);
        Cactus cactus4 = new Cactus();
        addObject(cactus4, 377, 137);
        Cactus cactus5 = new Cactus();
        addObject(cactus5, 340, 121);
        Cactus cactus6 = new Cactus();
        addObject(cactus6, 314, 138);
        Cactus cactus7 = new Cactus();
        addObject(cactus7, 290, 119);
        Cactus cactus8 = new Cactus();
        addObject(cactus8, 266, 146);
        Cactus cactus9 = new Cactus();
        addObject(cactus9, 253, 120);
        Cactus cactus10 = new Cactus();
        addObject(cactus10, 225, 139);
        Cactus cactus11 = new Cactus();
        addObject(cactus11, 190, 116);
        Cactus cactus12 = new Cactus();
        addObject(cactus12, 186, 141);
        Cactus cactus13 = new Cactus();
        addObject(cactus13, 158, 116);
        Cactus cactus14 = new Cactus();
        addObject(cactus14, 132, 145);
        Cactus cactus15 = new Cactus();
        addObject(cactus15, 492, 156);
        Cactus cactus16 = new Cactus();
        addObject(cactus16, 447, 146);
        caja1.setLocation(341, 230);
        maderota.setLocation(424, 64);
        maderita.setLocation(556, 209);
        cactusizq.setLocation(554, 170);
        maderita2.setLocation(50, 208);
        cactusder.setLocation(44, 171);
        maderota2.setLocation(231, 68);
        cactus14.setLocation(158, 20);
        cactus13.setLocation(191, 24);
        cactus11.setLocation(215, 20);
        cactus12.setLocation(131, 30);
        cactus10.setLocation(246, 21);
        cactus9.setLocation(291, 36);
        cactus8.setLocation(315, 46);
        cactus7.setLocation(363, 33);
        cactus8.setLocation(322, 30);
        cactus9.setLocation(279, 29);
        cactus6.setLocation(396, 13);
        cactus5.setLocation(433, 15);
        cactus6.setLocation(395, 18);
        cactus4.setLocation(458, 28);
        cactus3.setLocation(485, 18);
        cactus2.setLocation(521, 27);
        cactus.setLocation(412, 34);
        cactus16.setLocation(400, 46);
        caja12.setLocation(343, 110);
        cactus15.setLocation(390, 26);
        cactus16.setLocation(435, 27);
        caja12.setLocation(339, 170);
        maderota2.setLocation(231, 127);
        maderota.setLocation(416, 124);
        cactus2.setLocation(515, 98);
        cactus3.setLocation(478, 97);
        cactus4.setLocation(455, 97);
        cactus16.setLocation(433, 99);
        cactus.setLocation(409, 97);
        cactus15.setLocation(387, 97);
        cactus7.setLocation(364, 93);
        cactus6.setLocation(333, 89);
        cactus5.setLocation(305, 87);
        cactus8.setLocation(273, 80);
        cactus9.setLocation(263, 88);
        cactus10.setLocation(236, 78);
        cactus11.setLocation(207, 69);
        cactus11.setLocation(209, 98);
        cactus10.setLocation(238, 101);
        cactus13.setLocation(187, 105);
        cactus12.setLocation(133, 97);
        cactus14.setLocation(161, 95);
        Maderita maderita3 = new Maderita();
        addObject(maderita3, 497, 44);
        Piedrita piedrita = new Piedrita();
        addObject(piedrita, 499, 12);
        Piedrita piedrita2 = new Piedrita();
        addObject(piedrita2, 139, 17);
        Maderita maderita4 = new Maderita();
        addObject(maderita4, 146, 52);
        piedrita2.setLocation(200, 17);
        maderita4.setLocation(201, 51);
        maderita2.setLocation(61, 214);
        cactusizq.setLocation(565, 163);
        maderita.setLocation(545, 210);
        cactusizq.setLocation(565, 168);
        maderota.setLocation(400, 124);
        cactus2.setLocation(501, 98);
        piedrita.setLocation(479, 19);
        maderita3.setLocation(473, 49);
        maderota.setLocation(380, 125);
        cactus3.setLocation(321, 87);
        cactus6.setLocation(348, 89);
        cactus6.setLocation(348, 91);
        cactus2.setLocation(479, 98);
    }

    /**
     *metodo para el tercer nivel
     */
    private void prepare3()
    {
        Patricio patricio = new Patricio();
        addObject(patricio, 327, 336);
        lives = new Letrero("Pretty Lives: "+ vidas);
        addObject(lives,80,20);
        score = new Letrero("Score: " + puntaje);
        addObject(score,503,20);
        puntos= new Score2();
        addObject(puntos,300,20);
        puntos.muestraPuntaje();
        Globito medio1 = new Globito(patricio, 3);
        addObject(medio1, 373, 293);
        Globito medio2 = new Globito(patricio, 3);
        addObject(medio2, 294, 292);
        patricio.recibeGlobo(medio1,medio2);
        patricio.setLocation(334, 342);
        medio2.setLocation(314, 289);
        medio1.setLocation(366, 289);
        Cactusizq cactusizq = new Cactusizq();
        addObject(cactusizq, 556, 93);
        Cactusder cactusder = new Cactusder();
        addObject(cactusder, 59, 160);
        Maderita maderita = new Maderita();
        addObject(maderita, 67, 209);
        maderita.setLocation(65, 202);
        Maderita maderita2 = new Maderita();
        addObject(maderita2, 562, 144);
        maderita2.setLocation(554, 137);
        Maderita maderita3 = new Maderita();
        addObject(maderita3, 470, 54);
        Maderita maderita4 = new Maderita();
        addObject(maderita4, 164, 117);
        maderita3.setLocation(452, 52);
        Piedrita piedrita = new Piedrita();
        addObject(piedrita, 464, 24);
        piedrita.setLocation(453, 18);
        Piedrita piedrita2 = new Piedrita();
        addObject(piedrita2, 169, 78);
        Caja1 caja1 = new Caja1();
        addObject(caja1, 174, 252);
        caja1.setLocation(168, 243);
        Caja1 caja12 = new Caja1();
        addObject(caja12, 469, 177);
        caja12.setLocation(458, 176);
        caja1.setLocation(168, 218);
        caja12.setLocation(457, 149);
    }

    /**
     * metodo para el cuarto nivel
     */
    private void prepare4()
    {
        Patricio patricio = new Patricio();
        addObject(patricio, 327, 336);
        lives = new Letrero("Pretty Lives: "+ vidas);
        addObject(lives,80,20);
        score = new Letrero("Score: " + puntaje);
        addObject(score,503,20);
        puntos= new Score2();
        addObject(puntos,300,20);
        puntos.muestraPuntaje();
        patricio.setLocation(334, 342);/**/
        Caja1 caja1 = new Caja1();
        addObject(caja1, 347, 167);
        caja1.setLocation(339, 168);
        Caja2 caja2 = new Caja2();
        addObject(caja2, 559, 182);
        caja2.setLocation(559, 174);
        Caja2 caja22 = new Caja2();
        addObject(caja22, 115, 173);
        caja22.setLocation(113, 171);
        caja22.setLocation(136, 170);
        caja2.setLocation(545, 169);
        Cactus cactus = new Cactus();
        addObject(cactus, 279, 37);
        Cactus cactus2 = new Cactus();
        addObject(cactus2, 306, 81);
        Cactus cactus3 = new Cactus();
        addObject(cactus3, 312, 52);
        Cactus cactus4 = new Cactus();
        addObject(cactus4, 337, 59);
        Cactus cactus5 = new Cactus();
        addObject(cactus5, 338, 72);
        Cactus cactus6 = new Cactus();
        addObject(cactus6, 364, 60);
        Cactus cactus7 = new Cactus();
        addObject(cactus7, 370, 32);
        Cactus cactus8 = new Cactus();
        addObject(cactus8, 401, 37);
        Cactus cactus9 = new Cactus();
        addObject(cactus9, 397, 67);
        Cactus cactus10 = new Cactus();
        addObject(cactus10, 259, 44);
        Cactus cactus11 = new Cactus();
        addObject(cactus11, 311, 31);
        Cactus cactus12 = new Cactus();
        addObject(cactus12, 436, 36);
        cactus2.setLocation(321, 76);
        caja2.setLocation(549, 188);
        caja2.setLocation(547, 185);
        cactus5.setLocation(351, 28);
        cactus4.setLocation(336, 24);
        cactus2.setLocation(346, 43);
        cactus9.setLocation(415, 37);
        cactus6.setLocation(388, 61);
        caja22.setLocation(225, 218);
        caja1.setLocation(339, 224);
        caja2.setLocation(549, 228);
        Caja1 caja12 = new Caja1();
        addObject(caja12, 457, 142);
        Caja1 caja13 = new Caja1();
        addObject(caja13, 99, 159);
        caja1.setLocation(217, 138);
        caja22.setLocation(355, 220);
        removeObject(caja13);
        Caja2 caja23 = new Caja2();
        addObject(caja23, 105, 208);
        caja2.setLocation(558, 230);
        caja12.setLocation(455, 136);
        caja1.setLocation(224, 137);
        cactus6.setLocation(396, 137);
        cactus3.setLocation(361, 136);
        cactus6.setLocation(381, 124);
        caja23.setLocation(96, 216);
        Globito extremo = new Globito(patricio, 5);
        addObject(extremo, 381, 297);
        Globito extremo2 = new Globito(patricio, 5);
        addObject(extremo2, 307, 294);
        extremo2.setLocation(311, 286);
        extremo.setLocation(370, 285);
        patricio.recibeGlobo(extremo,extremo2);
        caja12.setLocation(460, 229);
        caja22.setLocation(340, 226);
        caja1.setLocation(214, 323);
        caja23.setLocation(131, 247);
        removeObject(caja23);
        caja1.setLocation(164, 232);
        caja22.setLocation(333, 226);
        caja22.setLocation(337, 226);
        caja12.setLocation(473, 229);
        caja2.setLocation(432, 331);
        removeObject(caja2);
        caja12.setLocation(470, 229);
        MaderaPuas maderapuas9 = new MaderaPuas();
        addObject(maderapuas9, 229, 171);
        caja1.setLocation(295, 212);
        caja22.setLocation(546, 157);
        caja1.setLocation(342, 215);
        maderapuas9.setLocation(281, 175);
        maderapuas9.setLocation(276, 173);
        MaderaPuas maderapuas10 = new MaderaPuas();
        addObject(maderapuas10, 430, 181);
        removeObject(caja12);
        caja22.setLocation(489, 225);
        Caja2 caja24 = new Caja2();
        addObject(caja24, 212, 216);
        Maderita maderita = new Maderita();
        addObject(maderita, 219, 89);
        Maderita maderita2 = new Maderita();
        addObject(maderita2, 494, 95);
        Piedrita piedrita = new Piedrita();
        addObject(piedrita, 501, 52);
        Piedrita piedrita2 = new Piedrita();
        addObject(piedrita2, 211, 50);
        cactus12.setLocation(392, 64);
        cactus10.setLocation(298, 61);
        cactus10.setLocation(304, 63);
    }

    /**
     * metodo que manda llamar a todo el segundo nivel
     */
    private void prepare2()
    {
        score = new Letrero("Score: " + puntaje);
        addObject(score,503,20);
        lives = new Letrero("Pretty Lives: "+ vidas);
        addObject(lives,80,20);
        puntos= new Score2();
        addObject(puntos,300,20);
        puntos.muestraPuntaje();
        Patricio patricio = new Patricio();
        addObject(patricio, 327, 336);
        Globito debil = new Globito(patricio, 3);
        addObject(debil, 373, 293);
        debil.setLocation(365, 283);
        Globito debil2 = new Globito(patricio, 3);
        addObject(debil2, 294, 292);
        debil2.setLocation(287, 286);
        patricio.recibeGlobo(debil,debil2);
        Maderota maderota = new Maderota();
        addObject(maderota, 230, 137);
        maderota.setRotation(45);
        patricio.setLocation(334, 342);
        debil2.setLocation(314, 289);
        debil.setLocation(366, 289);
        Caja2 caja2 = new Caja2();
        addObject(caja2, 361, 231);
        Maderota maderota2 = new Maderota();
        addObject(maderota2, 451, 134);
        maderota2.setRotation(-30);
        maderota.setRotation(30);
        maderota.setLocation(201, 134);
        maderota2.setLocation(454, 134);
        caja2.setRotation(43);
        caja2.setLocation(344, 194);
        maderota2.setLocation(467, 122);
        maderota.setLocation(223, 122);
        Caja1 caja1 = new Caja1();
        addObject(caja1, 554, 144);
        caja1.setRotation(90);
        caja1.setLocation(551, 124);
        Caja1 caja12 = new Caja1();
        addObject(caja12, 159, 142);
        caja12.setRotation(90);
        caja12.setLocation(159, 136);
        caja2.setLocation(346, 197);
        maderota2.setLocation(451, 107);
        maderota.setLocation(235, 107);
        maderota.setRotation(20);
        maderota.setLocation(234, 118);
        maderota2.setRotation(20);
        maderota2.setRotation(-20);
        maderota2.setLocation(465, 120);
        maderota.setLocation(228, 117);
        caja2.setLocation(349, 188);
        caja1.setLocation(552, 134);
        caja2.setRotation(45);
        maderota2.setLocation(464, 117);
        caja1.setLocation(529, 139);
        caja2.setLocation(340, 188);
        maderota.setLocation(220, 116);
        maderota2.setLocation(453, 118);
        Cactus cactus = new Cactus();
        addObject(cactus, 324, 113);
        Cactus cactus2 = new Cactus();
        addObject(cactus2, 360, 114);
        Cactus cactus3 = new Cactus();
        addObject(cactus3, 383, 71);
        Cactus cactus4 = new Cactus();
        addObject(cactus4, 406, 114);
        cactus4.setLocation(412, 88);
        Cactus cactus5 = new Cactus();
        addObject(cactus5, 436, 55);
        Cactus cactus6 = new Cactus();
        addObject(cactus6, 480, 74);
        Cactus cactus7 = new Cactus();
        addObject(cactus7, 518, 60);
        Cactus cactus8 = new Cactus();
        addObject(cactus8, 299, 90);
        Cactus cactus9 = new Cactus();
        addObject(cactus9, 270, 76);
        Cactus cactus10 = new Cactus();
        addObject(cactus10, 238, 64);
        Cactus cactus11 = new Cactus();
        addObject(cactus11, 218, 58);
        Cactus cactus12 = new Cactus();
        addObject(cactus12, 177, 46);
        cactus12.setRotation(10);
        cactus11.setRotation(120);
        cactus11.setLocation(209, 71);
        cactus10.setRotation(50);
        cactus9.setRotation(-50);
        cactus8.setRotation(20);
        cactus.setRotation(-120);
        cactus2.setRotation(120);
        cactus3.setRotation(50);
        cactus4.setRotation(-50);
        cactus6.setRotation(80);
        cactus7.setRotation(-80);
        caja2.setLocation(339, 199);
        caja12.getX();
        caja12.setLocation(159, 148);
        cactus.setLocation(316, 112);
    }

    /**
     * metodo para el primer nivel
     */
    public void prepare1()
    {
        setBackground("fondo.png");
        score = new Letrero("Score: " + puntaje);
        addObject(score,503,20);
        lives = new Letrero("Pretty Lives: "+ vidas);
        addObject(lives,80,20);
        puntos= new Score2();
        addObject(puntos,300,20);
        puntos.muestraPuntaje();
        Patricio patricio = new Patricio();
        addObject(patricio, 327, 336);
        Globito debil = new Globito(patricio, 1);
        addObject(debil, 373, 293);
        debil.setLocation(365, 283);
        Globito debil2 = new Globito(patricio, 1);
        addObject(debil2, 294, 292);
        debil2.setLocation(287, 286);
        patricio.recibeGlobo(debil,debil2);
        Maderota maderota = new Maderota();
        addObject(maderota, 340, 206);
        Maderita maderita = new Maderita();
        addObject(maderita, 210, 97);
        Piedrita piedrita = new Piedrita();
        addObject(piedrita, 233, 57);
        piedrita.setLocation(219, 30);
        Cactus cactus = new Cactus();
        addObject(cactus, 419, 71);
        Cactus cactus2 = new Cactus();
        addObject(cactus2, 384, 101);
        Cactus cactus3 = new Cactus();
        addObject(cactus3, 336, 78);
        Cactus cactus4 = new Cactus();
        addObject(cactus4, 301, 136);
        maderita.setLocation(209, 77);
        patricio.setLocation(318, 342);
        debil2.setLocation(299, 288);
        debil.setLocation(351, 287);
        maderota.setLocation(340, 184);
        cactus4.setLocation(300, 116);
        maderota.setLocation(339, 169);
        Caja1 caja1 = new Caja1();
        addObject(caja1, 341, 220);
        caja1.setLocation(340, 211);
        caja1.act();
        caja1.getImage();
        caja1.setLocation(338, 201);
        patricio.setLocation(334, 342);
        debil2.setLocation(314, 289);
        debil.setLocation(366, 289);
    }

    /**
     * metodo para eliminar todo los objetos que se encuentren en el mundo y asi poder
     * pasar al otro nivel.
     */

    public void remove()
    {
        int aux;
        aux=this.getObjects(null).size();
        Actor a;
        for(int i=0;i<aux;i++)
        {
            a = (Actor) this.getObjects(null).get(0);
            this.removeObject(a);  
        }
    }

    /**
     * metodo para llamar a cada nivel 
     */
    public void cambiaJuego()
    {
        if(puntos!=null)
            puntaje+=puntos.damePuntaje();
        remove();
        nivel++;
        switch(nivel)
        {
            case 1:
            puntaje=0;
            vidas=3;
            prepare1();

            break;

            case 2:
            prepare2();
            break;

            case 3:
            prepare3();
            break;

            case 4:
            prepare4();
            break;

            case 5:
            prepare5();
            break;
            case 6:
            Letrero letrero= new Letrero("Ganaste, eres cool =D\nPuntaje: "+puntaje);
            addObject(letrero,getWidth()/2,getHeight()/2);
            Back b= new Back();
            addObject(b,getWidth()/2+200,getHeight()/2+100);
            actualicemosPuntos();
            break;
        }

    }

    /**
     * metodo que ayuda a regresar al menu
     */
    public void regresaMenu()
    {
        nivel=0;
        ponNivel();
    }

    /**
     * metodo para reiniciar el nivel cada que se decremente una vida
     */
    public void reiniciaNivel()
    {
        remove();
        vidas--;

        if(vidas>=0)
        {
            switch(nivel)
            {
                case 0:
                prepare();
                break;
                case 1:
                puntaje=0;
                prepare1();
                break;

                case 2:
                prepare2();
                break;

                case 3:
                prepare3();
                break;

                case 4:
                prepare4();
                break;

                case 5:
                prepare5();
                break;
            }
            String cad="Pretty Lives: "+vidas;
            lives.muestraLetrero(cad);
        }
        else
        {
            Letrero letrero= new Letrero("Perdiste Perdedor\n pepepepe Perdedor");
            addObject(letrero,getWidth()/2,getHeight()/2);
            Back b= new Back();
            addObject(b,getWidth()/2+200,getHeight()/2+100);
        }
    }

    /**
     * metodo para poner cada nivel
     */
    public void ponNivel()
    {
        remove();

        switch(nivel)
        {
            case 0:
            prepare();
            break;
            case 1:
            puntaje=0;
            vidas=3;
            prepare1();
            break;

            case 2:
            prepare2();
            break;

            case 3:
            prepare3();
            break;

            case 4:
            prepare4();
            break;

            case 5:
            prepare5();
            break;
        }
        if(lives!=null)
        {
            String cad="Pretty Lives: "+vidas;
            lives.muestraLetrero(cad);
        }

    }

    /**
     * Metodo que acomoda los records de mayor puntaje que se han generado en el juego
     */
    public void GameRecords()
    {

        this.setBackground("menu.png");
        java.util.List records=UserInfo.getTop(7);
        RecordUser usuario;
        UserInfo info;
        if(records!=null)
        {
            for(int i=0; i<records.size(); i++)
            {
                info=(UserInfo)records.get(i);
                usuario=new RecordUser((i+1)+".- "+info.getUserName(),info.getScore());
                usuario.addToWorld(50+35*i,this);
            }

            Letrero let;
            if(UserInfo.getMyInfo().getRank()>0)
            {
                let=new Letrero("Your Position:"+UserInfo.getMyInfo().getRank());
            }
            else
            {
                let=new Letrero("You aren't in the Records List");
            }
            this.addObject(let,20+(let.getImage().getWidth()/2),380);
        }
        else
        {
            Letrero letr=new Letrero("Whitout Scores...");
            this.addObject(letr,350,250);
        }

    }

    /**
     * metodo para poder actualizar el puntaje checa si es menor o mayor el puntaje obtenido en el
     * juego, si es mayor se agrega un nuevo record.
     */
    public void actualicemosPuntos()
    {
        if(UserInfo.isStorageAvailable())
        {

            UserInfo info=UserInfo.getMyInfo();
            if(puntaje>info.getScore())
            {
                info.setScore(puntaje);
            }
            info.store();
        }
    }

}

